home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / ivl / src / ivl_ftbl.c < prev    next >
Text File  |  2000-06-18  |  6KB  |  203 lines

  1. /*
  2. #define DEBUG
  3. *    ivl
  4. *
  5. *    ファイルリスト登録管理
  6. *
  7. *    from Jun.26,1999    by dummy.x.(with J-SAGA INDUSTRY)
  8. */
  9. #include    <stddef.h>
  10. #include    <string.h>
  11. #include    "comtype.h"
  12. #include    "easymac.h"
  13. #include    "sysconst.h"
  14. #include    "dummyc.h"
  15. #include    "hufilec.h"
  16. #include    "libpt4.h"
  17. #include    "ivl.h"
  18. #include    "mkpathfn.c"
  19.  
  20. /* 定数定義 */
  21. #define    FILE_TBL_BLOCK    64        /* ファイル名管理テーブルの1ブロックに含まれるファイル数 */
  22.  
  23. /* 大域変数 */
  24.     /* 表示ファイル管理 */
  25. long arg_file_kaz;        /* 管理ファイル数 */
  26. filelist_t *arg_file_tblp;    /* ファイル管理テーブルアドレス */
  27.  
  28. /* ファイル内変数 */
  29. static long arg_file_tbl_max;        /* 現在のテーブルで管理できるファイル数 */
  30. static char arg_file_tbl_alloc_failed;    /* テーブル拡張失敗フラグ(=!0:既に失敗している) */
  31.  
  32.  
  33. /* ファイル管理テーブルを拡張する
  34. *    返値:    拡張できればそのテーブルメモリアドレス
  35. *        できなかった場合は NULL
  36. *    注記    * 関連する各ファイル内変数の値を直接書き替える。
  37. */
  38. static
  39. filelist_t *enhance_file_tbl(void)
  40. {
  41.     filelist_t *nptblp = arg_file_tblp;
  42.     long curtblmax = arg_file_tbl_max;
  43.  
  44.     curtblmax += FILE_TBL_BLOCK;            /* 登録数増加 */
  45.     nptblp = (filelist_t *)realloc(nptblp, (curtblmax * sizeof(filelist_t)));
  46.                             /* メモリ拡張 */
  47.     /* 拡張に成功したらファイル内変数を書き替える */
  48.     if (nptblp != NULL) {
  49.         arg_file_tblp = nptblp;
  50.         arg_file_tbl_max = curtblmax;
  51.     }
  52.     return nptblp;
  53. }
  54.  
  55. /* DOS _FILES データ同士を比較して、同じファイルかを調べる
  56. *    引数:    files0p,files1p    - 比較対象データへのポインタ
  57. *    返値:    同じファイルならば !0、違っていれば 0
  58. */
  59. static
  60. int is_same_filesbuf(const _filesbuf_t *files0p, const _filesbuf_t *files1p)
  61. {
  62.     int result;
  63. #if    0
  64.     if (chkbit(state_flag_bits. FBIT_FNCASE)) {    /* ファイル名の大小文字が有効 */
  65.         /* ファイル名以外はそのまま比較、
  66.         *  ファイル名は文字列比較('\0'以降のゴミを考慮して)
  67.         */
  68.         result = (memcmp(files0p, files1p, offsetof(_filesbuf_t, name)) == 0)
  69.             && (strcmp(files0p->name, files1p->name) == 0);
  70.     } else {                    /* ファイル名の大小文字は無効 */
  71.         /* ファイル名に関する部分は文字列比較(大小無視で)
  72.         *  ファイル名以外はそのまま比較
  73.         */
  74.         int i, j, k;
  75.  
  76.         i = offsetof(_filesbuf_t, filename);
  77.         j = sizeof(files1p->filename) + sizeof(files1p->ext);
  78.         k = offsetof(_filesbuf_t, name) - offsetof(_filesbuf_t, atr);
  79.         result = (memcmp(files0p, filesc1p, i) == 0)
  80.             && (strnicmp(files0p->filename, files1p->filename, j) == 0)
  81.             && (memcmp(files0p->atr, files1p->atr, k) == 0)
  82.             && (strncmp(files0p->name, files1p->name) == 0);
  83.     }
  84. #else
  85.     int i, j, k;
  86.  
  87.     i = offsetof(_filesbuf_t, filename);
  88.     j = sizeof(files1p->filename) + sizeof(files1p->ext);
  89.     k = offsetof(_filesbuf_t, name) - offsetof(_filesbuf_t, atr);
  90.     result = (memcmp(files0p, files1p, i) == 0)
  91.         && (strnicmp(files0p->filename, files1p->filename, j) == 0)
  92.         && (memcmp(&(files0p->atr), &(files1p->atr), k) == 0)
  93.         && (stricmp(files0p->name, files1p->name) == 0);
  94.  
  95. #endif
  96.  
  97.     return result;
  98. }
  99.  
  100. /* 同じファイルが既にリストに登録されているか調べる
  101. *    引数:    entno    - リスト登録番号
  102. *        filesp    - DOS _FILES バッファアドレス
  103. *    返値:    登録されていれば !0、なければ 0
  104. */
  105. static
  106. int is_entried_file(int entno, const _filesbuf_t *filesp)
  107. {
  108.     const filelist_t *flistp = arg_file_tblp + entno;
  109.  
  110.     while (--flistp >= arg_file_tblp) {
  111.         if (is_same_filesbuf(filesp, &(flistp->fbuf))) {
  112.             /* 同じファイルあり! */
  113.             return !0;
  114.         }
  115.     }
  116.     /* 結局同じファイルはなかった */
  117.     return 0;
  118. }
  119.  
  120. /* ファイル名を管理テーブルへ登録する
  121. *    引数:    pathp    - ファイル存在パス名へのポインタ
  122. *        filesp    - DOS _FILES バッファアドレス
  123. *    返値:    登録番号(0~)
  124. *        某かの理由で失敗した場合は <0
  125. */
  126. long entry_arg_file_name(const char *pathp, const _filesbuf_t *filesp)
  127. {
  128.     int entno = arg_file_kaz;
  129.     char rdres;
  130.     short wdots = -1, hdots = -1;
  131.     pt4_struct_t *rdbufp;
  132.     char *cp;
  133.     filelist_t *flistp;
  134.  
  135.     /* テーブル拡張に失敗してたらファイル名の登録はなし */
  136.     if (arg_file_tbl_alloc_failed) {
  137.         return -1;
  138.     }
  139.  
  140.     /* 用意したテーブルが一杯になってたら拡張する */
  141.     if (entno >= arg_file_tbl_max) {
  142.         if (enhance_file_tbl() == NULL) {    /* 拡張失敗 */
  143.             ttlprintf("ファイル名管理テーブルの拡張に失敗しました。\n");
  144.             ttlprintf("%s%s 以降に指定されたファイルは表示できません。\n"
  145.                 , pathp, filesp->name);
  146.             arg_file_tbl_alloc_failed = !0;    /* 失敗したフラグをセット */
  147.             return -1;
  148.         }
  149.     }
  150.  
  151.     /* パス名複製 */
  152.     cp = strdup(pathp);
  153.     if (cp == NULL) {    /* 複製失敗 */
  154.         ttlprintf("ファイル %s%s をテーブル登録できなかったため、表示できません。\n"
  155.             , pathp, filesp->name);
  156.         return -2;
  157.     }
  158.  
  159.     /* 同じファイルが既に登録されていないか調べる */
  160.     if (is_entried_file(entno, filesp)) {    /* 同じファイルあり! */
  161. _DEBUGJOB(ttlprintf("ファイル %s%s は既にテーブル登録済みです。\n", pathp, filesp->name));
  162.         return -3;    /* 登録せずに返る */
  163.     }
  164.  
  165.     /* 複製ファイル名アドレスをテーブルに登録 */
  166.     flistp = arg_file_tblp + entno;
  167.     if (chkbit(state_flag_bits, FBIT_ONMEMORY)) {    /* 先行読み込みする */
  168.         rdres = read_pt4(&rdbufp, make_path_filename(cp, filesp));
  169.         if (rdres == RDPT4_SUCCESS) {
  170.             wdots = rdbufp->width;
  171.             hdots = rdbufp->height;
  172. /*        } else {
  173.             wdots = hdots = -1;
  174. */        }
  175.     } else if (chkbit(state_flag_bits, FBIT_ONMEM_SZ)) {    /* サイズだけ先行読み込み */
  176.         pt4_struct_t phed;
  177.  
  178.         rdres = read_pt4_head(&phed, make_path_filename(cp, filesp));
  179.         if (rdres == RDPT4_SUCCESS) {
  180.             rdres = RDPT4_READ_FAIL;    /* 読み込み失敗としておく */
  181.             wdots = phed.width;
  182.             hdots = phed.height;
  183. /*        } else {
  184.             wdots = hdots = -1;
  185. */        }
  186.     } else {                    /* 先行読み込みしない */
  187.         rdres = RDPT4_READ_FAIL;
  188.         rdbufp = NULL;
  189. /*        wdots = hdots = -1;
  190. */    }
  191.     flistp->rdresult = rdres;    /* 読み込み結果 */
  192.     flistp->pathp = cp;        /* パス名 */
  193.     flistp->fbuf = *filesp;        /* DOS _FILES データ */
  194.     flistp->rdbufp = rdbufp;    /* 読み込みバッファアドレス */
  195.     flistp->wdots = wdots;        /* 横幅 */
  196.     flistp->hdots = hdots;        /* 縦高 */
  197.  
  198.     arg_file_kaz++;        /* 管理ファイル数計上 */
  199.  
  200.     return entno;
  201. }
  202.  
  203.